package com.ipan.weixin.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.lang.time.DateUtils;

/**
 * 时间转换工具类。
 * 
 * @author iPan
 * @version 2009-11-11
 */
public class WxDateUtils extends DateUtils {

	/** pattern: yyyy-MM-dd HH:mm:ss */
	public static final String PATTERN_1 = "yyyy-MM-dd HH:mm:ss";

	/** pattern: yyyy-MM-dd */
	public static final String PATTERN_2 = "yyyy-MM-dd";

	/** pattern: yyyy/MM/dd HH:mm:ss */
	public static final String PATTERN_3 = "yyyy/MM/dd HH:mm:ss";

	/** pattern: yyyy/MM/dd */
	public static final String PATTERN_4 = "yyyy/MM/dd";

	/** pattern: HH:mm:ss */
	public static final String PATTERN_5 = "HH:mm:ss";
	
	public static final String DAY_TIME_NAME_1 = "凌晨";
	public static final String DAY_TIME_NAME_2 = "早晨";
	public static final String DAY_TIME_NAME_3 = "上午";
	public static final String DAY_TIME_NAME_4 = "中午";
	public static final String DAY_TIME_NAME_5 = "下午";
	public static final String DAY_TIME_NAME_6 = "傍晚";
	public static final String DAY_TIME_NAME_7 = "晚上";
	public static final String DAY_TIME_NAME_8 = "深夜";

	private static Map<String, DateFormat> context = new ConcurrentHashMap<String, DateFormat>();

	/**
	 * 创建DateFormat对象。
	 * 
	 * @param pattern 时间模式
	 * @param locale 区域语言
	 * @return DateFormat
	 */
	public static DateFormat getDateFormat(String pattern, Locale locale) {
		DateFormat format = null;
		if (context.containsKey(pattern)) {
			format = context.get(pattern);
		} else {
			format = new SimpleDateFormat(pattern, locale);
			context.put(pattern, format);
		}
		return format;
	}

	public static Date parseDate(String pattern, String str) throws ParseException {
		if (str == null || "".equals(str)) {
			return null;
		}
		DateFormat format = getDateFormat(pattern, Locale.getDefault());
		return format.parse(str);
	}

	/**
	 * 格式化时间字符串为指定格式字符串。
	 * 
	 * @param srcPattern 原时间模式
	 * @param desPattern 目标时间模式
	 * @param srcDate 原时间
	 * @return 格式化时间字符串
	 * @throws ParseException 解析异常
	 */
	public static String format(String srcPattern, String desPattern, String srcDate) throws ParseException {
		if (srcDate == null || "".equals(srcDate)) {
			return "";
		}
		String ret = null;
		DateFormat format = getDateFormat(srcPattern, Locale.getDefault());
		Date date = format.parse(srcDate);
		ret = getDateFormat(desPattern, Locale.getDefault()).format(date);
		return ret;
	}

	/**
	 * 格式化时间。
	 * 
	 * @param desPattern 指定时间模式
	 * @param date 时间
	 * @return 格式化时间
	 */
	public static String format(String desPattern, Date date) {
		if (date == null) {
			return "";
		}
		DateFormat format = getDateFormat(desPattern, Locale.getDefault());
		return format.format(date);
	}

	/**
	 * 返回当前年份。
	 * 
	 * @return 年
	 */
	public static int getSysYear() {
		return Calendar.getInstance().get(Calendar.YEAR);
	}
	
	/**
	 * 返回时间段。
	 * 
	 * @param date 时间
	 * @return 时间段名称
	 */
	public static String getDayTimeName(Date date) {
		
		String result = null;
		
		try {
			long curDate = parseDate(PATTERN_5, format(PATTERN_5, date)).getTime();
			long date1 = parseDate(PATTERN_5, "03:00:00").getTime();
			long date2 = parseDate(PATTERN_5, "06:00:00").getTime();
			long date3 = parseDate(PATTERN_5, "08:00:00").getTime();
			long date4 = parseDate(PATTERN_5, "11:00:00").getTime();
			long date5 = parseDate(PATTERN_5, "13:00:00").getTime();
			long date6 = parseDate(PATTERN_5, "17:00:00").getTime();
			long date7 = parseDate(PATTERN_5, "19:00:00").getTime();
			long date8 = parseDate(PATTERN_5, "23:00:00").getTime();
			
			if (curDate > date1 && curDate <= date2) {
				result = DAY_TIME_NAME_1;
			} else if (curDate > date2 && curDate <= date3) {
				result = DAY_TIME_NAME_2;
			} else if (curDate > date3 && curDate <= date4) {
				result = DAY_TIME_NAME_3;
			} else if (curDate > date4 && curDate <= date5) {
				result = DAY_TIME_NAME_4;
			} else if (curDate > date5 && curDate <= date6) {
				result = DAY_TIME_NAME_5;
			} else if (curDate > date6 && curDate <= date7) {
				result = DAY_TIME_NAME_6;
			} else if (curDate > date7 && curDate <= date8) {
				result = DAY_TIME_NAME_7;
			} else {
				result = DAY_TIME_NAME_8;
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
	/**
	 * 返回时间段。
	 * 
	 * @param date 时间
	 * @return 时间段名称
	 */
	public static String getDayTimeName() {
		return getDayTimeName(new Date());
	}
	
	public static String getSysDate(String pattern) {
		return format(pattern, new Date());
	}
	
	/**
	 * 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的秒数；
	 * 
	 * @return 秒数
	 */
	public static long getSecond() {
		return new Date().getTime() / 1000;
	}
}
